const { AsyncParallelBailHook } = require('tapable')

let hook = new AsyncParallelBailHook(['name'])

// 对于异步钩子的使用 在添加事件监听时会存在三种方式： tap  tapAsync   tapPromise

// hook.tap('fn1', (name) => {
//     console.log('fn1 ----> ', name);
// })

// hook.tap('fn2', (name) => {
//     console.log('fn2 ----> ', name);
// })


// hook.callAsync('zzzz', () => {
//     console.log('完成');
// })

console.time('time')

hook.tapAsync('fn1', (name, callback) => {
    setTimeout(() => {
        console.log('fn1 ----> ', name);
        callback()
    }, 1000)
})

hook.tapAsync('fn2', (name, callback) => {
    setTimeout(() => {
        console.log('fn2 ----> ', name);
        callback('err')
    }, 2000)
})
hook.tapAsync('fn3', (name, callback) => {
    setTimeout(() => {
        console.log('fn3 ----> ', name);
        callback()
    }, 3000)
})


hook.callAsync('lg', () => {
    console.log('完成了');
    console.timeEnd('time')
})


// console.time('time')

// hook.tapPromise('fn1', (name) => {
//     return new Promise((resolve, reject) => {
//         setTimeout(() => {
//             console.log('fn1 ----> ', name);
//             resolve()
//         }, 1000)
//     })
// })

// hook.tapPromise('fn2', (name) => {
//     return new Promise((resolve, reject) => {
//         setTimeout(() => {
//             console.log('fn2 ----> ', name);
//             resolve()
//         }, 2000)
//     })
// })


// hook.promise('fffff').then(() => {
//     console.log('完成');
//     console.timeEnd('time')
// })